package com.ld.poetry.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.ld.poetry.entity.Label;
import com.ld.poetry.entity.Sort;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;

/**
 * 文章视图对象（Article View Object）
 * 
 * 功能说明：
 * 1. 用于前端展示和交互的文章信息对象
 * 2. 包含文章的基本信息、统计信息和关联信息
 * 3. 支持文章的创建、编辑、展示等操作
 * 
 * 使用场景：
 * 1. 文章发布和编辑
 * 2. 文章列表展示
 * 3. 文章详情查看
 * 4. 文章统计管理
 * 
 * 注意事项：
 * 1. 必填字段需要添加验证注解
 * 2. 时间字段使用统一的格式
 * 3. 关联对象需要正确封装
 * 4. 统计字段需要及时更新
 */
@Data
public class ArticleVO {

    /**
     * 文章ID
     * 
     * 功能说明：
     * 1. 文章的唯一标识符
     * 2. 主键，自增
     * 
     * 数据库字段：id
     * 字段类型：Integer
     * 是否必填：是
     * 是否唯一：是
     */
    private Integer id;

    /**
     * 用户ID
     * 
     * 功能说明：
     * 1. 文章作者的用户ID
     * 2. 关联用户表
     * 
     * 数据库字段：user_id
     * 字段类型：Integer
     * 是否必填：是
     * 是否唯一：否
     */
    private Integer userId;

    /**
     * 文章封面
     * 
     * 功能说明：
     * 1. 文章的封面图片地址
     * 2. 用于文章列表展示
     * 
     * 数据库字段：article_cover
     * 字段类型：String
     * 是否必填：否
     * 
     * 约束条件：
     * - 查询为空时随机选择
     * - 建议使用相对路径
     * - 建议设置默认封面
     */
    private String articleCover;

    /**
     * 文章标题
     * 
     * 功能说明：
     * 1. 文章的标题
     * 2. 用于文章展示和搜索
     * 
     * 数据库字段：article_title
     * 字段类型：String
     * 是否必填：是
     * 
     * 约束条件：
     * - 不能为空
     * - 建议限制长度
     * - 建议过滤敏感内容
     */
    @NotBlank(message = "文章标题不能为空")
    private String articleTitle;

    /**
     * 文章内容
     * 
     * 功能说明：
     * 1. 文章的详细内容
     * 2. 支持富文本格式
     * 
     * 数据库字段：article_content
     * 字段类型：String
     * 是否必填：是
     * 
     * 约束条件：
     * - 不能为空
     * - 建议限制大小
     * - 建议过滤危险内容
     */
    @NotBlank(message = "文章内容不能为空")
    private String articleContent;

    /**
     * 浏览量
     * 
     * 功能说明：
     * 1. 文章的访问次数统计
     * 2. 用于文章热度计算
     * 
     * 数据库字段：view_count
     * 字段类型：Integer
     * 是否必填：否
     * 默认值：0
     */
    private Integer viewCount;

    /**
     * 点赞量
     * 
     * 功能说明：
     * 1. 文章的点赞次数统计
     * 2. 用于文章热度计算
     * 
     * 数据库字段：like_count
     * 字段类型：Integer
     * 是否必填：否
     * 默认值：0
     */
    private Integer likeCount;

    /**
     * 评论状态
     * 
     * 功能说明：
     * 1. 控制文章是否允许评论
     * 2. 用于文章权限管理
     * 
     * 数据库字段：comment_status
     * 字段类型：Boolean
     * 是否必填：否
     * 默认值：true
     * 
     * 取值说明：
     * - true: 允许评论
     * - false: 禁止评论
     */
    private Boolean commentStatus;

    /**
     * 推荐状态
     * 
     * 功能说明：
     * 1. 标识文章是否被推荐
     * 2. 用于文章展示排序
     * 
     * 数据库字段：recommend_status
     * 字段类型：Boolean
     * 是否必填：否
     * 默认值：false
     * 
     * 取值说明：
     * - true: 推荐
     * - false: 不推荐
     */
    private Boolean recommendStatus;

    /**
     * 视频URL
     * 
     * 功能说明：
     * 1. 文章关联的视频地址
     * 2. 用于视频文章展示
     * 
     * 数据库字段：video_url
     * 字段类型：String
     * 是否必填：否
     * 
     * 约束条件：
     * - 建议使用相对路径
     * - 建议限制视频大小
     */
    private String videoUrl;

    /**
     * 文章访问密码
     * 
     * 功能说明：
     * 1. 文章的访问密码
     * 2. 用于文章权限控制
     * 
     * 数据库字段：password
     * 字段类型：String
     * 是否必填：否
     * 
     * 约束条件：
     * - 建议加密存储
     * - 建议设置有效期
     */
    private String password;

    /**
     * 文章提示信息
     * 
     * 功能说明：
     * 1. 文章的提示或说明信息
     * 2. 用于文章展示补充
     * 
     * 数据库字段：tips
     * 字段类型：String
     * 是否必填：否
     * 
     * 约束条件：
     * - 建议限制长度
     * - 建议过滤敏感内容
     */
    private String tips;

    /**
     * 查看状态
     * 
     * 功能说明：
     * 1. 标识文章是否被查看
     * 2. 用于文章状态管理
     * 
     * 数据库字段：view_status
     * 字段类型：Boolean
     * 是否必填：否
     * 默认值：false
     * 
     * 取值说明：
     * - true: 已查看
     * - false: 未查看
     */
    private Boolean viewStatus;

    /**
     * 创建时间
     * 
     * 功能说明：
     * 1. 文章的创建时间
     * 2. 用于文章排序和统计
     * 
     * 数据库字段：create_time
     * 字段类型：LocalDateTime
     * 是否必填：是
     * 
     * 格式说明：
     * - 前端展示格式：yyyy-MM-dd HH:mm:ss
     * - 时区：GMT+8
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 更新时间
     * 
     * 功能说明：
     * 1. 文章的最后更新时间
     * 2. 用于文章修改记录
     * 
     * 数据库字段：update_time
     * 字段类型：LocalDateTime
     * 是否必填：是
     * 
     * 格式说明：
     * - 前端展示格式：yyyy-MM-dd HH:mm:ss
     * - 时区：GMT+8
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;

    /**
     * 更新者
     * 
     * 功能说明：
     * 1. 记录最后更新文章的人
     * 2. 用于文章修改追踪
     * 
     * 数据库字段：update_by
     * 字段类型：String
     * 是否必填：否
     */
    private String updateBy;

    /**
     * 文章分类ID
     * 
     * 功能说明：
     * 1. 文章所属分类的ID
     * 2. 关联分类表
     * 
     * 数据库字段：sort_id
     * 字段类型：Integer
     * 是否必填：是
     * 
     * 约束条件：
     * - 不能为空
     * - 必须存在对应的分类
     */
    @NotNull(message = "文章分类不能为空")
    private Integer sortId;

    /**
     * 文章标签ID
     * 
     * 功能说明：
     * 1. 文章所属标签的ID
     * 2. 关联标签表
     * 
     * 数据库字段：label_id
     * 字段类型：Integer
     * 是否必填：是
     * 
     * 约束条件：
     * - 不能为空
     * - 必须存在对应的标签
     */
    @NotNull(message = "文章标签不能为空")
    private Integer labelId;

    /**
     * 评论数量
     * 
     * 功能说明：
     * 1. 文章的评论数量统计
     * 2. 用于文章热度计算
     * 
     * 数据库字段：无（计算字段）
     * 字段类型：Integer
     * 是否必填：否
     * 
     * 注意事项：
     * - 该字段需要查询时封装
     * - 建议使用缓存优化
     */
    private Integer commentCount;

    /**
     * 作者用户名
     * 
     * 功能说明：
     * 1. 文章作者的用户名
     * 2. 用于文章展示
     * 
     * 数据库字段：无（关联字段）
     * 字段类型：String
     * 是否必填：否
     * 
     * 注意事项：
     * - 该字段需要查询时封装
     * - 建议使用缓存优化
     */
    private String username;

    /**
     * 文章分类对象
     * 
     * 功能说明：
     * 1. 文章所属的分类信息
     * 2. 用于文章展示和导航
     * 
     * 数据库字段：无（关联对象）
     * 字段类型：Sort
     * 是否必填：否
     * 
     * 注意事项：
     * - 该字段需要查询时封装
     * - 建议使用缓存优化
     */
    private Sort sort;

    /**
     * 文章标签对象
     * 
     * 功能说明：
     * 1. 文章所属的标签信息
     * 2. 用于文章展示和分类
     * 
     * 数据库字段：无（关联对象）
     * 字段类型：Label
     * 是否必填：否
     * 
     * 注意事项：
     * - 该字段需要查询时封装
     * - 建议使用缓存优化
     */
    private Label label;

    /**
     * 是否有视频
     * 
     * 功能说明：
     * 1. 标识文章是否包含视频
     * 2. 用于文章类型判断
     * 
     * 数据库字段：无（计算字段）
     * 字段类型：Boolean
     * 是否必填：否
     * 默认值：false
     * 
     * 取值说明：
     * - true: 有视频
     * - false: 无视频
     * 
     * 注意事项：
     * - 该字段根据videoUrl判断
     * - 建议使用缓存优化
     */
    private Boolean hasVideo = false;
}
